#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time    : 2025/5/8 15:43
@Author  : HZP
@File    : base_service.py
"""
from typing import Any

from internal.exception.exception import FailException
from pkg.sqlalchemy import SQLAlchemy


class BaseService:
    db: SQLAlchemy

    def create(self, model: Any, **kwargs) -> Any:
        # 使用with语句自动提交数据库事务
        with self.db.auto_commit():
            # 创建模型实例
            model_instance = model(**kwargs)
            # 将模型实例添加到数据库会话中
            self.db.session.add(model_instance)
        # 返回模型实例
        return model_instance

    def update(self, model: Any, **kwargs) -> Any:
        # 使用with语句自动提交数据库事务
        with self.db.auto_commit():
            # 遍历kwargs中的键值对
            for field, value in kwargs.items():
                # 如果model中存在该属性
                if hasattr(model, field):
                    # 将属性值设置为kwargs中的值
                    setattr(model, field, value)
                else:
                    # 否则抛出异常
                    raise FailException("更新数据失败")
            # 返回model
            return model

    def delete(self, model: Any) -> Any:
        # 使用with语句自动提交数据库事务
        with self.db.auto_commit():
            # 删除传入的model对象
            self.db.session.delete(model)
            # 返回删除的model对象
            return model

    # 定义一个get方法，接收两个参数model和id，返回一个Any类型的值
    def get(self, model: Any, id: Any) -> Any:
        # 使用self.db.session.query方法查询model，并返回id对应的值
        return self.db.session.query(model).get(id)
